iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
DevOps

自動化測試大作戰系列 第 4

常用 Assertion 函數(一)

  • 分享至 

  • xImage
  •  

Medium 清新閱讀版連結

前一天我們實作了第一個測試,我們學到了第一個 Assert 函數 assertEquals
今天讓我們來了解其他常用的 Assert 函數吧!

通用型 Assertion 函數

  1. assertEmpty

    • 函數簽名:assertEmpty(mixed $actual[, string $message = ''])

    • 函數說明: 從字面上來解釋,這個函數是用來判斷第1個輸入參數 $actual 是否為 Empty,PHP常見空值可參考PHP官方函數 empty() 的說明。

    • 實作範例:

      /**
       * Example for assertEmpty()
       * @return void
       */
      public function testAssertEmpty()
      {
      	// 七種「空」值
          $emptyArray = [];
          $emptyString = '';
          $null = null;
          $zeroInt = 0;
          $zeroFloat = 0.0;
          $zeroIntString = '0';
          $false = FALSE;
      
      	// 以下各 Assertion 皆會通過測試
          $this->assertEmpty($emptyArray);
          $this->assertEmpty($emptyString);
          $this->assertEmpty($null);
          $this->assertEmpty($zeroInt);
          $this->assertEmpty($zeroFloat);
          $this->assertEmpty($zeroIntString);
          $this->assertEmpty($false);
      }
      

      要特別注意的是, "0" 會被認定為空值,但 "0.0" 卻不會,這點要小心。

  2. assertEquals

    • 函數簽名: assertEquals(mixed $expected, mixed $actual[, string $message = ''])

    • 函數說明: 此函數可用以判斷,第1個參數 $expected 與第2個參數 $actual,兩者之值是否相等。

    • 實作範例:

      /**
       * Example for assertEquals()
       * @return void
       */
      public function testAssertEquals()
      {
          // 範例值
          $string = 'string';
          $intOne = 1;
          $intZero = 0;
          $floatOne = 1.0;
          $floatZero = 0.0;
          $array1 = [];
          $array2 = ['string'];
          $stdClass1 = new \stdClass();
          $stdClass1->a_field = 'a';
          $stdClass2 = new \stdClass();
          $stdClass2->a_field = 'a';
      
          // 以下各 Assertion 皆會通過測試
          $this->assertEquals('string', $string);
          $this->assertEquals(1, $intOne);
          $this->assertEquals(0, $intZero);
          $this->assertEquals(1.0, $floatOne);
          $this->assertEquals(0.0, $floatZero);
          $this->assertEquals([], $array1);
          $this->assertEquals(['string'], $array2);
          $this->assertEquals($stdClass1, $stdClass2);
      
          // 以下為非相同資料型態,但會判定為相等的情況
          $this->assertEquals($intOne, $floatOne);
          $this->assertEquals($intZero, $floatZero);
      }
      

      要特別注意的是,$intOne 會被認定為與 $floatOne 相等,$intZero$floatZero 也是。

  3. assertSame

    • 函數簽名:assertSame(mixed $expected, mixed $actual[, string $message = ''])

    • 函數說明: 此函數可用以判斷,第1個參數 $expected 與第2個參數 $actual,兩者之資料型態與值是否相等。

    • 實作範例:

      /**
       * Example for assertSame()
       * @return void
       */
      public function testAssertSame()
      {
          // 範例值
          $string = 'string';
          $intOne = 1;
          $intZero = 0;
          $floatOne = 1.0;
          $floatZero = 0.0;
          $array1 = [];
          $array2 = ['string'];
      
          // 範例物件
          $stdClass1 = new \stdClass();
          $stdClass1->a_field = 'a';
          $stdClass2 = new \stdClass();
          $stdClass2->a_field = 'a';
          $stdClass3 = $stdClass2;
      
          // 以下各 Assertion 皆會通過測試
          $this->assertSame('string', $string);
          $this->assertSame(1, $intOne);
          $this->assertSame(0, $intZero);
          $this->assertSame(1.0, $floatOne);
          $this->assertSame(0.0, $floatZero);
          $this->assertSame([], $array1);
          $this->assertSame(['string'], $array2);
      
          // 以下 Assertion 會通過測試,因兩者指向相同的物件參考位置
          $this->assertSame($stdClass3, $stdClass2);
      
          // 以下為非相同資料型態,但會判定為相等的情況
          $this->assertSame($intOne, $floatOne);
          $this->assertSame($intZero, $floatZero);
      
          // 以下 Assertion 將會不通過測試,因兩者所指向之物件參考位置不同
          $this->assertSame($stdClass1, $stdClass2);
      }
      

      值得一提的是,與 assertEquals() 相同的是,$intOne 會被認定為與 $floatOne 相等,$intZero$floatZero 也是;與 assertEquals() 不同的是,它會認定2個擁有相同屬性結構的類別變數是 不同 的。

  4. assertTrue

    • 函數簽名: assertTrue(bool $condition[, string $message = ''])

    • 函數說明: 此函數可用以判斷,第1個參數是否為 TRUE

    • 實作範例:

      /**
       * Example for assertTrue()
       * @return void
       */
      public function testAssertTrue()
      {
          $notEmptyString = 'a';
          $notZeroInt = 1;
          $notZeroFloat = 0.1;
          $stdClass = new \stdClass();
          $true = TRUE;
      
          // 以下各 Assertion 皆會通過測試
          $this->assertTrue(true);
          $this->assertTrue($true);
          $this->assertTrue(1 == 1);
          $this->assertTrue(1 === 1);
          $this->assertTrue($true);
      
          // 以下 Assertion 將會不通過測試
          $this->assertTrue($notEmptyString);
          $this->assertTrue($notZeroInt);
          $this->assertTrue($notZeroFloat);
          $this->assertTrue($stdClass);
      }	
      

      特別注意,assertTrue的第1個參數之資料型態必須是bool,代入字串或其他資料型態都會不通過。

  5. assertFalse

    • 函數簽名:assertFalse(bool $condition[, string $message = ''])

    • 函數說明: 與 assertTrue 相對,此函數可用以判斷,第1個參數是否為 FALSE

    • 實作範例:

      /**
       * Example for assertFalse()
       * @return void
       */
      public function testAssertFalse()
      {
          $notEmptyString = 'a';
          $notZeroInt = 1;
          $zeroInt = 0;
          $notZeroFloat = 0.1;
          $zeroFloat = 0.0;
          $stdClass = new \stdClass();
          $false = FALSE;
      
          // 以下各 Assertion 皆會通過測試
          $this->assertFalse(false);
          $this->assertFalse($false);
          $this->assertFalse(1 > 1);
          $this->assertFalse(1 < 1);
          $this->assertFalse(1 != 1);
      
          // 以下 Assertion 將會不通過測試
          $this->assertFalse($notEmptyString);
          $this->assertFalse($notZeroInt);
          $this->assertFalse($zeroInt);
          $this->assertFalse($notZeroFloat);
          $this->assertFalse($zeroFloat);
          $this->assertFalse($stdClass);
      }
      

      同樣要注意,assertFalse的第1個參數之資料型態必須是bool,代入字串或其他資料型態都會不通過。

  6. assertIsArray

    • 函數簽名:assertIsArray($actual[, $message = ''])

    • 函數說明: 顧名思義,此函數可用來判斷第1個參數是否為 Array 型態。

    • 實作範例:

      /**
       * Example for assertIsArraye()
       * @return void
       */
      public function testAssertIsArray()
      {
          $array1 = [];
          $array2 = ['2'];
          $array3 = ['key' => 'value'];
          $collection = collect([]);
      
          // 以下各 Assertion 皆會通過測試
          $this->assertIsArray($array1);
          $this->assertIsArray($array2);
          $this->assertIsArray($array3);
          $this->assertIsArray($collection->toArray());
      
          // 以下 Assertion 將會不通過測試
          $this->assertIsArray($collection);
      }	
      

      特別注意的是,當你想判定的對象可能是 Collection 時,直接代入 assertIsArray() 將導致判定不通過。

  7. assertIsInt

    • 函數簽名:assertIsInt($actual[, $message = ''])

    • 函數說明: 此函數可用來判斷第1個參數是否為 Int 型態。

    • 實作範例:

      /**
       * Example for assertIsInt()
       * @return void
       */
      public function testAssertIsInt()
      {
          $int1 = 0;
          $int2 = 1;
          $float1 = 0.0;
          $float2 = 1.0;
          $string1 = '0';
          $string2 = '1';
      
          // 以下各 Assertion 皆會通過測試
          $this->assertIsInt($int1);
          $this->assertIsInt($int2);
      
          // 以下 Assertion 將會不通過測試
          $this->assertIsInt($float1);
          $this->assertIsInt($float2);
          $this->assertIsInt($string1);
          $this->assertIsInt($string2);
      }	
      
  8. assertIsFloat

    • 函數簽名:assertIsFloat($actual[, $message = ''])

    • 函數說明: 此函數可用來判斷第1個參數是否為 Float 型態。

    • 實作範例:

      /**
       * Example for assertIsFloat()
       * @return void
       */
      public function testAssertIsFloat()
      {
          $float1 = 0.0;
          $float2 = 1.0;
          $float3 = -1.0;
      
          // 以下各 Assertion 皆會通過測試
          $this->assertIsInt($float1);
          $this->assertIsInt($float2);
          $this->assertIsInt($float3);
      }
      

    以上是幾個通用型 Assertion 函數,有興趣的讀者,可參考範例練習看看。

    明天來介紹 Cookie、Session、HTTP 相關的 Assertion 函數。

參考資料


上一篇
初試啼聲
下一篇
常用 Assertion 函數(二)
系列文
自動化測試大作戰31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言